/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cliente;

import conexion.ConectarFase;
import conexion.ConectarRanking;
import conexion.ConectarUsuario;
import elementos.*;
import java.awt.Color;

public class GestorFase implements GoalListener{
    
    private Principal applet;
    private Fase fase;
    private int faseActual=0;
    private Composite scene;
    private AnimationController controller=null;;
    private Renderer renderer=null;
    private FileSaver file= new FileSaver();
    private ConectarFase loader;
    private ConectarRanking ranking;
    private ConectarUsuario userload;
    private String usuario;
    
    private long tiempo;
    

    public GestorFase(Principal applet) {
        this.applet = applet;
        loader=new ConectarFase();
        ranking=new ConectarRanking();
        userload=new ConectarUsuario();
        fase=new Fase(0,0,0,"Computer",usuario,0);
    }
    
    //mismo bean pero con modificiacion
    public void cargarNivel(int level){
        if(level>0){
            fase=new Fase(level,0,0,"Computer",usuario,0);
            faseActual=level;
            //leer del servidor(bean)
            Composite s = (Composite) loader.loadPhase(faseActual);
            //cargar la escena     
            tiempo=System.currentTimeMillis();
            cargarEscena(s);
        }else if(level==0){
            ContinuarFase();
        }else{
            SiguienteFase();
        }
    }
    
    public void ContinuarFase(){
        faseActual= this.getLevel();
        if(faseActual<0) faseActual=1;
        fase=new Fase(faseActual,0,0,"Computer",usuario,0);
        //leer del servidor(bean)
        Composite s=(Composite)loader.loadPhase(faseActual);
        //cargar la escena     
        tiempo=System.currentTimeMillis();
        cargarEscena(s);
    }
    
    //bean sin odificacion
    public void SiguienteFase(){
        if(faseActual==10) faseActual=0;
        fase=new Fase(++faseActual,0,0,"Computer",usuario,0);
        //leer del servidor(bean)
        Composite s=(Composite)loader.loadPhase(-1);
        //cargar la escena     
        tiempo=System.currentTimeMillis();
        cargarEscena(s);
    }
    
    public void cargarEscena(Composite s){
        scene=s;
        if(controller!=null)controller.exit();
        controller=new AnimationController(scene, applet);
        applet.getVjuego().addMouseListener(controller);
        //applet.addKeyListener(controller);
        for(int i=0;i<scene.size();i++){
            if(scene.getChild(i)instanceof Boundary){
                ((Boundary)scene.getChild(i)).addKillBricklListener(controller);
                ((Boundary)scene.getChild(i)).addGoalListener(controller);
                ((Boundary)scene.getChild(i)).addGoalListener(this);
            }
        }
        controller.start();
        if(renderer!=null)renderer.exit();
        renderer=new Renderer(scene,applet);
        renderer.start();
    }

    public Fase getFase() {
        return fase;
    }
    
    public void pausar(boolean pausa){
        if(pausa){
            if(controller!=null)controller.exit();
            if(renderer!=null)renderer.exit();
            
        }else{
            cargarEscena(scene);
        }
    }

    public void test(){
        scene = new Composite();
        Ball b = new Ball(400,230,1,-1,5);
        Boundary bordes = new Boundary(1,1, 799,459);
        //bordes.addKillBricklListener(controller);
        //añadimos los cuadrados, los bordes y la pelota al escenario
        Bar b1,b2;
        b1= new Bar(25,180,25,100,Color.red,0,5);
        //b1.addKillBricklListener(controller);
        b2 =new Bar(750,180,25,100,Color.blue,1,5);
        //b2.addKillBricklListener(controller);
        //añadimos los cuadrados, los bordes y la pelota al escenario
        scene.add(bordes);
        scene.add(b1);
        scene.add(b2);
        scene.add(b);     
        
        cargarEscena(scene);
    }
    
    public void save(){
        for(int i=0;i<scene.size();i++){
            if(scene.getChild(i)instanceof Boundary){
                ((Boundary)scene.getChild(i)).clearCollisionListeners();
                ((Boundary)scene.getChild(i)).clearKillBrickListeners();
            }else if(scene.getChild(i)instanceof Bar){
                ((Bar)scene.getChild(i)).clearKillBrickListeners();
            }
        }
        file.write("/Users/julio/fase"+faseActual+".txt", scene);
        faseActual++;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    
    public int getLevel(){
        int i=userload.getUserLevel(usuario);
        if(i<0){
            return 1;
        }
        return i;
    }
    
    public void setLevel(int level){
        userload.setUserLevel(usuario, level);
    }
    
    @Override
    public void onGoal(Ball b) {
        //player 1 goal
        String user;
        if(b.getDX()>0){
            applet.getVjuego().GoalPlayer1();
            fase.setScore1(fase.getScore1()+1);
            user=fase.getPlayer1();
        }else{
            //player2 goal
            applet.getVjuego().GoalPlayer2();
            fase.setScore2(fase.getScore2()+1);
            user=fase.getPlayer2();
        }
        if (fase.isFinished()){
            if(user.equals("Computer")){
                parar();
                applet.changeToGameOver();
            }else{
                parar();
                tiempo=System.currentTimeMillis()-tiempo;
                fase.setTime(tiempo/1000);
                fase.setRanking(ranking.saveScore(user, fase.getTime(), fase.getNumero()));
                applet.changeToFinFase(fase);
                setLevel(fase.getNumero()+1);
            }
        }
        
    }
    
    public void parar(){
        controller.exit();
        renderer.exit();
    }
    
    
}